package itheima.JavaSE.Test;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class Inventory {
    //    List集合来管理所有商品的库存情况【共20分】
    private List<Product> products = null;

    public Inventory() {
        products = new ArrayList<Product>();
    }

    //    定义入库方法，实现添加商品到库存以及库存数量增加，同名的商品要通过价格去区分。
    //接受一个Product对象作为参数，并将其添加到products列表中
    public void addProduct(Product product) {
        products.add(product);
    }

    //接受商品的名称、价格和数量作为参数
    public void addProductToInventory(String name, double price, int quantity) {
        //将products列表转换为一个流
        products.stream()
                //找出流中所有名称和价格与传入参数匹配的Product对象是否相等
                .filter(p -> p.getName().equals(name) && p.getPrice() == price)
                .findFirst()
                .ifPresent(p -> p.addProduct(quantity));
    }

    //    定义减少商品库存方法，实现库存商品数量减少，同名的商品要通过价格去区分。
//    商品不存在的话抛出运行时异常"商品不存在"。并在调用方或者更上层使用try cat捕获异常，并打印。
    public void reduceProductFromInventory(String name, double price, int quantity) {
        products.stream()
                .filter(p -> p.getName().equals(name) && p.getPrice() == price)
                .findFirst()
                .orElseThrow(() -> new RuntimeException("商品不存在"))
                .reduceProduct(quantity);
    }

    //    定义通过名称查询商品库存信息，要求使用stream流来实现查找，
//    并且将查询结果转换成字符串并拼接换行符和分割线（============）返回，假如商品不存在要返回商品不存在。
    public String queryProductByName(String name) {
        return products.stream()
                .filter(p -> p.getName().equals(name))
                .map(Product::toString)
                .collect(Collectors.joining("\n============\n"));
    }

    public void loadFile(String filePath) {

    }

    //查询所有商品信息
    public String displayProducts() {

        if (products.isEmpty()) {
            //返回空库存的消息：
            return "仓库为空，赶快添加内容吧~";
        }
        //返回所有商品信息：
        //使用流处理非空库存：
        return products.stream()
                //映射商品信息：
                .map(Product::toString)
                //收集和连接字符串：
                .collect(Collectors.joining("\n"));
    }

    public void saveToFile(String filePath) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) {
            for (Product product : products) {
                writer.write(product.getProductInfo());
                writer.newLine();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
